/////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2014, pa.eeapai@gmail.com                                         //
// All rights reserved.                                                            //
//                                                                                 //
// Redistribution and use in source and binary forms, with or without              //
// modification, are permitted provided that the following conditions are met:     //
//     * Redistributions of source code must retain the above copyright            //
//       notice, this list of conditions and the following disclaimer.             //
//     * Redistributions in binary form must reproduce the above copyright         //
//       notice, this list of conditions and the following disclaimer in the       //
//       documentation and/or other materials provided with the distribution.      //
//     * Neither the name of the pa.eeapai@gmail.com nor the                       //
//       names of its contributors may be used to endorse or promote products      //
//       derived from this software without specific prior written permission.     //
//                                                                                 //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND //
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED   //
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE          //
// DISCLAIMED. IN NO EVENT SHALL pa.eeapai@gmail.com BE LIABLE FOR ANY             //
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      //
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;    //
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND     //
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT      //
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS   //
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                    //
/////////////////////////////////////////////////////////////////////////////////////

#ifndef __WINUSB_COMM_2_SHARED_H__
#define __WINUSB_COMM_2_SHARED_H__

typedef enum _EWinUSBCommVersion
{
  winusbcommversion1a,  ///< Previous version (only one) don't have GetVersion command.
  winusbcommversion1b,  ///< It has winusbctrlGETSTATUS command which might return 0, 1 or 2.
  winusbcommversion1c,  ///< All these values are understood as v1.
  winusbcommversion1,   ///< v1.
  winusbcommversion2,   ///< v2.
}EWinUSBCommVersion;

typedef enum _EWinUSBComm2Command
{
  winusbcomm2commandNone,                ///< Device does nothing
  winusbcomm2commandReset = 0x80,        ///< Device aborts all requests and commands and resets in state ready for new packet reception
  winusbcomm2commandGetVersion,          ///< Device sends 1 byte with WinUSB Comm version
  winusbcomm2commandGetState,            ///< Device sends 1 byte with value of current state (Of EWinUSBComm2State)
  winusbcomm2commandGetBufferSize,       ///< Device sends 4 bytes with comm buffer size (little endian - LSByte first in buffer)
  winusbcomm2commandGetReturnSize,       ///< Device sends 4 bytes with return packet size (little endian - LSByte first in buffer)
  winusbcomm2commandFollowingPacketSize, ///< Device receives 4 bytes with following packet size (little endian - LSByte first in buffer)
}EWinUSBComm2Command;

typedef enum _EWinUSBComm2State
{
  winusbcomm2stateIdle,         ///< Device will probably enter receiving state
  winusbcomm2stateReceiving,    ///< Device is waiting for new packet
  winusbcomm2stateSending,      ///< Device has finished processing and has response packet ready to send or is sending it
  winusbcomm2stateError,        ///< Device in bad state
}EWinUSBComm2State;


#endif // __WINUSB_COMM_2_SHARED_H__
